package Banco;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AcessoBanco {

    private static Connection AcessarBanco() throws SQLException {
        return Conexao.getConnection(TipoConexao.Servidor, "localhost", "", "3306", "casashow", "root", "root");
    }

    public static void ExecutarNaoQuery(String nomeProcedure) {
        try {
            String strProcedure = "{ call " + nomeProcedure + "() }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static void ExecutarNaoQuery(String nomeProcedure, ParametroSQL[] ListaParametro) {
        try {
            String strParametros = "";
            for (int i = 0; i < ListaParametro.length; i++) {
                if (i == 0) {
                    strParametros += "?";
                } else {
                    strParametros += ", ?";
                }
            }
            String strProcedure = "{ call " + nomeProcedure + "(" + strParametros + ") }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);

            for (ParametroSQL parametro : ListaParametro) {
                cs.setObject(parametro.getNome(), parametro.getValor());
            }
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public static int ExecutarNaoQuery1(String nomeProcedure, ParametroSQL[] ListaParametro) throws SQLException {
        int id=0;
        try {
            String strParametros = "";
            for (int i = 0; i < ListaParametro.length; i++) {
                if (i == 0) {
                    strParametros += "?";
                } else {
                    strParametros += ", ?";
                }
            }
            String strProcedure = "{ call " + nomeProcedure + "(" + strParametros + ", @"+id+") }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);

            for (ParametroSQL parametro : ListaParametro) {
                cs.setObject(parametro.getNome(), parametro.getValor());
            }
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        }

        ResultSet rs = null;
        try {

            String strProcedure = " SELECT @"+id;
            // String strProcedure = "{ call " + nomeProcedure + "(?) }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);
            cs.execute();

            rs = cs.getResultSet();


        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        } 
        id=rs.getInt(1);  
        System.out.print(id);
        return id;
        
    }
    /**.
     * Realisa update
     * @param nomeProcedure
     * @param ListaParametro 
     */
        public static void ExecutarNaoQueryUpdate(String nomeProcedure,int id, ParametroSQL[] ListaParametro) {
        try {
            String strParametros = "";
            for (int i = 0; i < ListaParametro.length; i++) {
                if (i == 0) {
                    strParametros += "?";
                } else {
                    strParametros += ", ?";
                }
            }
            String strProcedure = "{ call " + nomeProcedure + "( "+id+","+ strParametros + ") }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);

            for (ParametroSQL parametro : ListaParametro) {
                cs.setObject(parametro.getNome(), parametro.getValor());
            }
            cs.execute();
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
public static void ExecutarNaoQueryUpdate1(String nomeProcedure,int id, String nome) {
        try {
            String strParametros = nome;   
            String strProcedure;
            strProcedure ="UPDATE banda SET nm_banda = '"+strParametros+"' WHERE id_banda="+id;
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);

            cs.executeQuery();
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static ResultSet ExecutarResultSet(String nomeProcedure, ParametroSQL[] ListaParametro) {

        ResultSet rs = null;
        try {
            String strParametros = "";

            //Monta a String que será inserida na linha do comando.
            for (int i = 0; i < ListaParametro.length; i++) {

                strParametros += ", ?";
            }
            String strProcedure = "{ call " + nomeProcedure + "(? " + strParametros + ") }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);

            for (ParametroSQL parametro : ListaParametro) {
                cs.setObject(parametro.getNome(), parametro.getValor(), (int) parametro.getTipo());
            }
            cs.execute();
            rs = cs.getResultSet();
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return rs;
        }
    }

    public static ResultSet ExecutarSql(String nomeProcedure) {

        ResultSet rs = null;
        try {

            String strProcedure = " SELECT nm_banda FROM banda WHERE ic_banda_disponivel=1";
            // String strProcedure = "{ call " + nomeProcedure + "(?) }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);
            cs.execute();

            rs = cs.getResultSet();


        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return rs;
        }

    }

    public static ResultSet ExecutarId(String nome) {
        ResultSet rs = null;
        try {

            String strProcedure = ("SELECT id_banda FROM banda WHERE nm_banda like'"+nome+"%'");
            // String strProcedure = "{ call " + nomeProcedure + "() }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);
            cs.execute();
           
            rs = cs.getResultSet();
        
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return rs;
        }

    }

    public static Object ExecutarEscalar(String nomeProcedure, ParametroSQL[] ListaParametro, String nomeRetorno, Object tipo) {
        Object retorno = null;
        try {
            String strParametros = "";

            //Monta a String que será inserida na linha do comando.
            for (int i = 0; i < ListaParametro.length; i++) {
                strParametros += ", ?";
            }
            String strProcedure = "{ call " + nomeProcedure + "(? " + strParametros + ") }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);

            for (ParametroSQL parametro : ListaParametro) {
                cs.setObject(parametro.getNome(), parametro.getValor(), (int) parametro.getTipo());
            }
            cs.execute();
            switch ((Integer) tipo) {
                case 16:
                    cs.registerOutParameter(1, java.sql.Types.BOOLEAN);
                    Boolean pBoolean = cs.getBoolean(1);
                    retorno = pBoolean;
                    break;
                case 8:
                    cs.registerOutParameter(1, java.sql.Types.DOUBLE);
                    Double pDouble = cs.getDouble(1);
                    retorno = pDouble;
                    break;
                case 4:
                    cs.registerOutParameter(1, java.sql.Types.INTEGER);
                    int pInteger = cs.getInt(1);
                    retorno = pInteger;
                    break;
                case 91:
                    cs.registerOutParameter(1, java.sql.Types.DATE);
                    Date pDate = cs.getDate(1);
                    retorno = pDate;
                    break;
                case 92:
                    cs.registerOutParameter(1, java.sql.Types.TIME);
                    Time pTime = cs.getTime(1);
                    retorno = pTime;
                    break;
                case 12:
                    cs.registerOutParameter(1, java.sql.Types.VARCHAR);
                    String pString = cs.getString(1);
                    retorno = pString;
                    break;
                case -6:
                    cs.registerOutParameter(1, java.sql.Types.TINYINT);
                    Integer pTinyInteger = cs.getInt(1);
                    retorno = pTinyInteger;
                    break;
                default:
                    retorno = null;
            }
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return retorno;
        }
    }

    public static Object ExecutarEscalar(String nomeProcedure, String nomeRetorno, Object tipo) {
        Object retorno = null;
        try {
            String strProcedure = "{ call " + nomeProcedure + "(?) }";
            CallableStatement cs = AcessarBanco().prepareCall(strProcedure);
            cs.execute();
            switch ((Integer) tipo) {

                case 16:
                    cs.registerOutParameter(1, java.sql.Types.BOOLEAN);
                    Boolean pBoolean = cs.getBoolean(1);
                    retorno = pBoolean;
                    break;
                case 8:
                    cs.registerOutParameter(1, java.sql.Types.DOUBLE);
                    Double pDouble = cs.getDouble(1);
                    retorno = pDouble;
                    break;
                case 4:
                    cs.registerOutParameter(1, java.sql.Types.INTEGER);
                    int pInteger = cs.getInt(1);
                    retorno = pInteger;
                    break;
                case 91:
                    cs.registerOutParameter(1, java.sql.Types.DATE);
                    Date pDate = cs.getDate(1);
                    retorno = pDate;
                    break;
                case 92:
                    cs.registerOutParameter(1, java.sql.Types.TIME);
                    Time pTime = cs.getTime(1);
                    retorno = pTime;
                    break;
                case 12:
                    cs.registerOutParameter(1, java.sql.Types.VARCHAR);
                    String pString = cs.getString(1);
                    retorno = pString;
                    break;
                case -6:
                    cs.registerOutParameter(1, java.sql.Types.TINYINT);
                    Integer pTinyInteger = cs.getInt(1);
                    retorno = pTinyInteger;
                    break;
                default:
                    retorno = null;
            }
        } catch (SQLException ex) {
            Logger.getLogger(AcessoBanco.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return retorno;
        }
    }
}
